package com.tsc.interceptor.demo;

import jakarta.servlet.Servlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chentl
 * @Date: 2025/06/02/上午9:07
 * @Description:
 */
public class ExecutionTimeInterceptor implements HandlerInterceptor {


    // 请求开始时间存储
    private static final ThreadLocal<Long> startTimeHolder = new ThreadLocal<>();

    //handler 参数通常是一个处理器对象（Handler），具体来说，这个处理器对象可以是以下几种类型之一
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // HandlerMethod 是一个特殊的处理器对象，它封装了处理器（控制器）中的某个方法及其相关信息（如方法参数、返回类型等）。
        // 当你使用基于注解的控制器时，preHandle 方法中的 handler 参数通常会是 HandlerMethod 类型。
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            String className = handlerMethod.getBeanType().getSimpleName();
            String methodName = handlerMethod.getMethod().getName();
            System.out.println("执行方法：" + className + "." + methodName + " 开始执行");
        }
        // 如果你的处理器实现了 HttpRequestHandler 接口，那么 handler 参数将会是这个实现类的一个实例。
        // HttpRequestHandler 接口提供了处理HTTP请求的简单方法。
        if (handler instanceof HttpRequestHandler){
            HttpRequestHandler httpRequestHandler = (HttpRequestHandler) handler;
            String className = httpRequestHandler.getClass().getSimpleName();
            System.out.println("执行方法：" + className + " 开始执行");
        }

        if (handler instanceof Servlet){
            Servlet servlet = (Servlet) handler;
            String className = servlet.getClass().getSimpleName();
            System.out.println("执行方法：" + className + " 开始执行");
        }

        return true;
    }
}
